home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 12: Textmags & Docs / nf_archive_12.iso / MAGS / SOURCES / ATARI_SRC.ZIP / atari source / DSHJ2 / COMP.C < prev    next >
Encoding:
C/C++ Source or Header  |  2001-02-10  |  18.9 KB  |  908 lines

  1. #include    "defs.h"
  2. #include    "comp.h"
  3.  
  4. #define        DEBUG        0
  5.  
  6. #define        Fac        4    /* Floating Accent bit mask    */
  7. #define        MIN_LEFT    10    /* minimum text buffer left    */
  8.  
  9. extern  char        *savecptr;
  10.  
  11. extern    unsigned char    HY_TYPE, fofg;
  12. extern    unsigned    hyph_index;
  13. extern    unsigned char    getfp(), *bwdct(), *prvp1(), *prvp2(), *prvp3(),
  14.             getLch();
  15.  
  16. /*    Locals        */
  17. static    unsigned    hypn = 0;    /* hyphenated line counter    */
  18.     unsigned char    *hyptr[65];
  19.  
  20. #if    DEBUG == 1
  21.     static    char    hbf[80];
  22.     static    char    *bfp, *hp1, *hp2;
  23. #endif
  24.  
  25. /*
  26.     Batch Composition & Line Break processor.
  27.     Only called by dotext(). Returns pointer to next text
  28.     if cpabt is 0 or 8 else -1L for all other true values
  29.     of cpabt.
  30. */
  31. unsigned char    *fend(text,done)
  32. struct textobj    *text;
  33. int        *done;
  34. {
  35.     unsigned char    *cptr;
  36.  
  37.     cpabt = 0;                /* no error so far...    */
  38.     if (current_char >= buf_end) {    
  39.         *done = 1;
  40.         return(-1L);
  41.     }                    
  42.     cptr        = savecptr;
  43.     buf_ptr[COMP]    = buf_end;
  44.     initfcmp();
  45.     movtotag(&cptr,COMP);
  46.     if (cpabt == -1)            /* reach break depth    */
  47.         cpabt = 0;            /* is not an error...    */
  48.  
  49.     if (!cpabt || cpabt == 8) {        /* no error or hit Rf    */
  50.         *done = (cptr >= buf_end);
  51.         savecptr = cptr;
  52.         cptr = free_start + (long)(cptr - current_char);
  53.     }
  54.     else {
  55.         CPrewindow(buf_end);
  56.         CPrewindow(text->begtext);
  57.         savecptr = current_char;
  58.         cptr = (unsigned char *)-1L;
  59.         *done = 0;
  60.     }
  61.     return(cptr);
  62. }
  63.  
  64. /*
  65.     Function to forward batch compose to tagged point of buffer. Set
  66.     cpabt:    8    -- Hit Region Feed
  67.         -1    -- reach defined break depth
  68.     Note:    Above true values except (-1) will be saved in cpabt flag.
  69. */
  70. movtotag(ptr,tag)
  71. unsigned char    **ptr;
  72. int        tag;
  73. {
  74.     unsigned char    em, rsovsp, c;
  75.     unsigned    hyw;
  76.  
  77. #if    DEBUG == 1
  78.     printf("\nIn movtotag..");
  79.     printf("\ncp.ll=%d cp.d=%ld cp.ls=%ld",cp.llen,cp.depth,cp.lnsp);
  80. #endif
  81.     while (!cpabt && *ptr < buf_ptr[tag])
  82.       switch(c = **ptr) {
  83.       case hrt: case Rf:
  84.         if (fwdct(ptr))
  85.             break;
  86.         hypn    = 0;
  87.         *ptr    += 3;
  88.         if (c == Rf)
  89.             cpabt = 8;
  90.         else
  91.         if (advdp())
  92.             cpabt = -1;
  93.         break;
  94.       case cr:
  95.         *ptr    += 2;
  96.         break;
  97.       case srt:
  98.         CPrewindow(*ptr);
  99.         *ptr    += 3;
  100.         if (tagc(*(free_start-2)))
  101.             em = 1;
  102.         else
  103.         if (*(free_start-1) == sHY) {    /* sHY+srt delete sHY    */
  104.             CPrewindow(free_start-1);
  105.             --cct;
  106.             if (buf_ptr[OVSP] == current_char)
  107.                 rsovsp = 1;
  108.             else
  109.             if (buf_ptr[PRFP] == current_char)
  110.                 rsovsp = 2;
  111.             else
  112.             if (buf_ptr[NLTP] == current_char)
  113.                 rsovsp = 3;
  114.             else    rsovsp = 0;
  115.             em = 2;
  116.         }
  117.         else    em =    *(free_start-1) == DH    ||
  118.                 *(free_start-1) == '-'    ||
  119.                 *(free_start-1) == Mdsh    ||    /* EM-    */
  120.                 *(free_start-1) == Ndsh        /* EN-    */
  121.                 ? 0:1;
  122.         if (current_char > *ptr)    /* delete srt+cr+lf    */
  123.             free_start    = *ptr;
  124.         else    current_char    = *ptr;
  125.         CPrewindow(current_char);
  126.         if (em == 1) {            /* adding space mode    */
  127.             *free_start++    = ' ';
  128.             CPrewindow(free_start-1);
  129.         }
  130.         else
  131.         if (em == 2) {            /* removing (-) mode    */
  132.             hyw = cwffp(HYfp);
  133.             if (cp.kernmd)
  134.                 kerning(HYfp,prvp1(free_start-1),&hyw);
  135.             clen += hyw;
  136.             if (rsovsp == 1)
  137.                 setbptr(OVSP);
  138.             else
  139.             if (rsovsp == 2)
  140.                 setbptr(PRFP);
  141.             else
  142.             if (rsovsp == 3)
  143.                 setbptr(NLTP);
  144.         }
  145.         *ptr = current_char;
  146.         break;
  147.       case sDH:
  148.         **ptr = DH;
  149.       case QL: case QR: case QC:
  150.       case DH:
  151.         ++(*ptr);
  152.         break;
  153.       default:
  154.         if (fwdct(ptr))
  155.             break;
  156.         ++(*ptr);
  157.         break;
  158.       }
  159. }
  160.  
  161. zerocpptrs()
  162. {
  163.     buf_ptr[NLTP]    = buf_ptr[OVSP]    =
  164.     buf_ptr[PRFP]    = buf_ptr[PRFS]    = 0L;
  165. }
  166.  
  167. /*
  168.     Function to handle line ending by
  169.     advancing Depth counter by Line Space
  170. */
  171. advdp()
  172. {
  173.     int    brk;
  174.  
  175.     if ((cdep + cp.lnsp) >= cp.depth)
  176.         brk    = 1;
  177.     else {
  178.         brk    = 0;
  179.         cdep    += cp.lnsp;
  180.         clen    = cp.llen;
  181.         smsz    = cp.ssiz;
  182.         lspc    = 0;
  183.         cct    = 0;
  184.         cmpval    = avcval = 0;
  185.         sflg    = inovs = false;
  186.         zerocpptrs();
  187.     }
  188.     return(brk);
  189. }
  190.  
  191. ckprefsp(p)
  192. char    *p;
  193. {
  194.     if (*p == ' ' && !buf_ptr[PRFS]) buf_ptr[PRFS] = p;
  195. }
  196.  
  197. ckrgeptr(p,tag)
  198. char    *p;
  199. int    tag;
  200. {
  201.     if (!buf_ptr[tag]) buf_ptr[tag] = p;
  202. }
  203.  
  204. /*
  205.     Function to advance line length counter by decreasing it by
  206.     the present character width.
  207.     Returns 1 if width is > Line Length else 0.
  208. */
  209. advll(cw,p)
  210. int    cw;
  211. char    *p;
  212. {
  213.     unsigned    ccnt;
  214.     int        tlen, rc;
  215.  
  216.     rc = 0;
  217.     if (!sflg && !inovs) {
  218.       if (cw > (int)clen) {
  219.         if (cp.jstmd == AJ)
  220.             sflg = 1;
  221.         else    goto ovs;
  222.       }
  223.       else    goto chk;
  224.     }
  225.     if (sflg == 1) {
  226.       tlen = clen + (cwfrw(cp.prfsp,1) * lspc);
  227.       if (tlen < 0 || cw > tlen) {
  228.         if (cp.ltsmd)
  229.             sflg = 2;
  230.         else {
  231.             sflg = 0;
  232.             goto ovs;
  233.         }
  234.       }
  235.       else {
  236.         ckrgeptr(p,PRFP);
  237.         ckprefsp(p);
  238.         goto nor;
  239.       }
  240.     }
  241.     if (sflg == 2) {
  242.       ccnt = cct ? cct - 1:0;
  243.       tlen = clen + (cwfrw(cp.prfsp,1) * lspc) +
  244.             (cwfrw(cp.nlts,1) * ccnt);
  245.       if (tlen < 0 || cw > tlen) {
  246.         sflg = 0;
  247.         goto ovs;
  248.       }
  249.       ckrgeptr(p,NLTP);
  250.       ckprefsp(p);
  251.     }
  252.     else
  253. chk:    if (inovs || (int)clen < 0)
  254. ovs:        rc = 1; 
  255. nor:    clen -= cw;
  256.     return(rc);
  257. }
  258.  
  259. /*
  260.     Function to find the present justification status
  261.     after moving backward.
  262. */
  263. findst()
  264. {
  265.     unsigned    ccnt;
  266.     int        tlen;
  267.  
  268.     if ((int)clen < 0) {
  269.       if (cp.jstmd != AJ)
  270.         goto ovs;
  271.       tlen = clen + (cwfrw(cp.prfsp,1) * lspc);
  272.       if (tlen >= 0) {
  273.         sflg    = 1;
  274.         inovs    = 0;
  275.       }
  276.       else 
  277.       if (cp.ltsmd) {
  278.         ccnt = cct ? cct - 1:0;
  279.         tlen += cwfrw(cp.nlts,1) * ccnt;
  280.         if (tlen >= 0) {
  281.             sflg    = 2;
  282.             inovs    = 0;
  283.         }
  284.         else    goto ovs;
  285.       }
  286.       else {
  287. ovs:        sflg    = 0;
  288.         inovs    = 1;
  289.       }
  290.     }
  291.     else    sflg = inovs = 0;
  292. }
  293.  
  294. /*
  295.     Function to test for short line length
  296. */
  297. cksll(cw)
  298. int    cw;
  299. {
  300.     return(!cct && cw > (int)clen);
  301. }
  302.  
  303. /*
  304.     Function to do forward counting on the character at pointer. Set
  305.     cpabt:    0    -- no error
  306.         1    -- char has no flash position
  307.         2    -- double floating accent found
  308.         3    -- double space char found
  309.         4    -- line measure too short
  310.         5    -- line break error (no space)
  311.         6    -- text buffer full
  312.         7    -- no memory for tag support
  313.         -1    -- reach defined break depth
  314.     Note:    Above true values except (-1) will be saved in cpabt flag.
  315. */
  316. fwdct(nptr)
  317. unsigned char **nptr;
  318. {
  319.     unsigned    i, cw, hyw, hycnt;
  320.     unsigned char    *ptr, *scc, *hyp, *ewp;
  321.     unsigned char    ccfp, hymd, cc;
  322.     char        ishy, nobrk, rshypn, fafg, sp_lts, fnd;
  323.  
  324.     ptr    = *nptr;
  325.     cw    = 0;
  326.     sp_lts    = 0;
  327.     if (*ptr == STAG)            /* Hit a Start    TAG    */
  328.         in_tag(*(++*nptr),1,1);
  329.     else
  330.     if (*ptr == ETAG)            /* Hit an End    TAG    */
  331.         out_tag(*(++*nptr),1,1);
  332.     else
  333.     if (fofg) {                /* validate Flash only    */
  334.         if (*ptr == sHY || !nofa(ptr,&ccfp))
  335.             goto bdchr;
  336.         else {
  337.             fofg = false;
  338.             goto extst;
  339.         }
  340.     }
  341.     else
  342.     if (*ptr == ' ') {            /* Hit a Spaceband    */
  343.         if (ptr > current_char) {    /* get prev. char pter    */
  344.           ewp = ptr-1;            /* in 2nd partition    */
  345.           while (ewp > current_char && tagc(*(ewp-1))) {
  346.             if (ptagc(*(ewp-1))) {
  347.                 --ewp;
  348.                 break;
  349.             }
  350.             else    ewp -= 2;
  351.           }
  352.           if (ewp < current_char)
  353.             goto prvbf;
  354.         }
  355.         else
  356. prvbf:          ewp = prvp3(free_start-1);    /* or 1st partition    */
  357.         if (*ewp == ' ') {
  358.             cpabt = 3;        /* double Spaces !    */
  359.             goto abort;
  360.         }
  361.         cw = cwfrw(spbval,0);
  362.         if (cksll(cw)) {
  363. sllen:            cpabt = 4;        /* short LineLen !    */
  364.             goto abort;
  365.         }
  366.         if (sflg == 2) {
  367.             sp_lts = 1;
  368.             goto mkbrk;
  369.         }
  370.     }
  371.     else {
  372.       if (ptr > current_char)        /* get prev. char pter    */
  373.         scc = prvp2(ptr-1);        /* for Kerning & CComp    */
  374.       else    scc = prvp1(free_start-1);
  375.       if (*ptr == sHY) {            /* Hit a Soft Hyphen    */
  376.         cw = cwffp(HYfp);
  377.         if (cp.kernmd)
  378.             kerning(HYfp,scc,&cw);
  379.         ++cct;
  380.       }
  381.       else
  382.       if (!allend(*ptr)) {            /* not a line ending...    */
  383.         fafg = gfpfa(&ccfp,ptr);
  384.         if (ccfp == 255) {
  385. bdchr:            cpabt = 1;        /* not valid char !    */
  386.             goto abort;
  387.         }
  388.         if (fafg && cpch(scc) && gfpfa(&fnd,scc)) {
  389.             cpabt = 2;
  390.             goto abort;        /* double Float Accent!    */
  391.         }
  392.         if (!fafg) {
  393.             ckcomp(scc);
  394.             if ((cw = cwffp(ccfp)) == -1)
  395.                 goto bdchr;
  396.             if (cp.kernmd)
  397.                 kerning(ccfp,scc,&cw);
  398.             if (cksll(cw))
  399.                 goto sllen;
  400.             ++cct;
  401.         }
  402.       }
  403.     }
  404. exchk:    if (advll(cw,ptr)) {            /* reach or in OVerSet    */
  405. #if    DEBUG == 1
  406.     printf("\nIn OVS cw=%d ptr=%lx c=%c",cw,ptr,*ptr);
  407. #endif
  408.         if (!inovs) inovs = true;
  409.         if (buf_ptr[OVSP] == 0L) {        /* save 1st OVS ptr  */
  410.             buf_ptr[OVSP] = ptr;
  411.             if (*ptr == ' ' && cp.jstmd != AJ) {
  412.                 buf_ptr[PRFP] = ptr;
  413.                 ++buf_ptr[OVSP];
  414.                 goto exfct;
  415.             }
  416.         }
  417.         if (*ptr == sHY && *(ptr+1) == srt)    /* skip sHY + srt... */
  418.             goto exfct;
  419.         if (clen >= 0x8000 && clen <= 0xac78)    /* too OVS force brk */
  420.             goto mkbrk;
  421.         if (*ptr != ' ' && !allend(*ptr))    /* non line break... */
  422.             goto extst;
  423. mkbrk:        if (!nofsp()) {            /* OK... Justify line    */
  424. #if    DEBUG == 1
  425.   printf("\nB in0: sp_lts=%d bp[PP]?=%d bp[PS]?=%d bp[NP]?=%d",
  426.     sp_lts,(buf_ptr[PRFP] != 0),(buf_ptr[PRFS] != 0),(buf_ptr[NLTP] != 0));
  427.   printf("\nB in1: sflg=%d inovs=%d bp[OV]=%lx *bp[OV]=%c clen=%d cct=%d",
  428.     sflg,inovs,buf_ptr[OVSP],(buf_ptr[OVSP] != 0) ? *buf_ptr[OVSP]:0,
  429.     clen,cct);
  430. #endif
  431.           inovs    = rshypn = 0;
  432.           hymd    = hycnt  = 0;
  433.           nobrk = 0;
  434.           CPrewindow(scc = ptr);
  435.           if (sp_lts)
  436.             setbptr(OVSP);
  437.           else    clen += cw;
  438.           if (buf_ptr[PRFS])
  439.             goto rmovs;
  440. rebrk:          hyp = free_start-1;
  441.           while (hyp > buf_start && !wbrk(hyp))
  442.             hyp = prvp1(hyp) - 1;
  443.           if (hyp < buf_start)
  444.             hyp = buf_start;
  445.           cc = getLch(hyp);
  446.           if (cc == ' ')
  447.             ++hyp;
  448.           else
  449.           if (cc == cr && getLch(hyp-1) == ' ')
  450.             hyp += 2;
  451.           else {
  452.             nobrk = 1;
  453.             if (allend(cc))
  454.                 hyp += 3;
  455.             else
  456.             if (cc == cr)
  457.                 hyp += 2;
  458.             else
  459.             if (cc == lf)
  460.                 ++hyp;
  461.           }
  462.           if (hypn >= cp.nsuchyp || *hyp == DH)
  463.             goto rmovs;
  464.           CPrewindow(ptr+1);        /* should be OK...    */
  465.           hypchk(hyp,ewp=free_start-1);    /* find HY break pts    */
  466.           hymd    = HY_TYPE;
  467.           hycnt = hyph_index;
  468. #if    DEBUG == 1
  469.     hp1 = hyp; hp2 = ewp;
  470.     for (bfp = hbf;hp1 <= hp2;*bfp++ = *hp1++);
  471.     *bfp = 0;
  472.     printf("\nword=%s hycnt=%d hymd=%d *h1=%c succ=%d nobrk=%d",
  473.         hbf,hycnt,hymd,hycnt ? *hyptr[0]:0x7e,hypn,nobrk);
  474. #endif
  475.           CPrewindow(ewp);        /* should be OK...    */
  476. rmovs:          ptr = free_start-1;        /* back out OVS range    */
  477. #if    DEBUG == 1
  478.     printf("\nBf rmovs.. hyp=%lx *hyp=%c bp[OV]=%lx *bp[OV]=%c",
  479.         ptr,*ptr,buf_ptr[OVSP],*buf_ptr[OVSP]);
  480. #endif
  481.           while (!cpabt && ptr >= buf_ptr[OVSP])
  482.             ptr = bwdct(ptr);
  483.           if (cpabt)
  484.             goto abort;
  485.           hyp = ptr;
  486. #if    DEBUG == 1
  487.     printf("\nAf rmovs.. hyp=%lx *hyp=%c bp[OV]=%lx *bp[OV]=%c",
  488.         hyp,*hyp,buf_ptr[OVSP],*buf_ptr[OVSP]);
  489. #endif
  490.           if (buf_ptr[PRFS]) {        /* space in Pref range    */
  491.             while (!cpabt && ptr > buf_ptr[PRFS])
  492.             ptr = bwdct(ptr);
  493.             if (cpabt)
  494.             goto abort;
  495. #if    DEBUG == 1
  496.     printf("\nSp Pref... ptr=%lx *ptr=%c cc=%lx *cc=%c",
  497.         ptr,*ptr,current_char,*current_char);
  498. #endif
  499. brksp:            if (getLch(ptr) == lf) --ptr;
  500.             CPrewindow(ptr);
  501.             ptr = current_char;
  502.             if (*ptr == ' ') {
  503.             CPrewindow(ptr+1);
  504.             --free_start;
  505.             }
  506.             else
  507.             if (*ptr == cr && getLch(free_start-1) == ' ')
  508.             --free_start;
  509.             else {
  510.             cpabt = 5;        /* no line break !    */
  511.             goto Equit;
  512.             }
  513.             --lspc;
  514.             clen += cwfrw(spbval,0);
  515.             if (hypn) rshypn = 1;
  516.           }
  517.           else
  518.           if (!hycnt || (!hymd && !cp.hypmd)) {    /* no HYphenation... */
  519.             if (sp_lts) {        /* space in -Lts range    */
  520. ltssp:            scc = ++current_char;
  521.             CPrewindow(scc);
  522.             cw = 0;
  523.             if (hypn) rshypn = 1;
  524.             }
  525.             else {
  526. nohyp:            if (*(ptr+1) == lf) ++ptr;
  527.             CPrewindow(ptr+1);
  528.             if (!nobrk) {        /* space in Just range    */
  529.               ptr = free_start-1;
  530.               while (!cpabt && ptr > buf_start && !wbrk(ptr))
  531.                 ptr = bwdct(ptr);
  532. #if    DEBUG == 1
  533.     printf("\nSp Just... ptr=%lx *ptr=%c cc=%lx *cc=%c",
  534.         ptr,*ptr,current_char,*current_char);
  535. #endif
  536.               if (cpabt)
  537.                 goto abort;
  538.               else    goto brksp;
  539.             }
  540.             if (nobrk    == 2        ||
  541.                 free_start    == buf_start    ||
  542.                 cct        < 2) {
  543.                 cpabt = 4;    /* short linelen !    */
  544.                 goto Equit;
  545.             }
  546. #if    DEBUG == 1
  547.     printf("\nDesperate HY..");
  548. #endif
  549.             hyp    = free_start-1;    /* where to rewind...    */
  550.             ptr    = prvp3(hyp);
  551.             if (ptr > buf_start) {    /* set desperate HY pts    */
  552.                 hyptr[1]= ptr;
  553.                 hyptr[0]= prvp3(--ptr);
  554.                 hycnt    = 2;
  555.             }
  556.             else {
  557.                 hyptr[0]= ptr;
  558.                 hycnt    = 1;
  559.             }
  560.             hymd    = 0;
  561.             nobrk    = 2;
  562.             goto brkhy;
  563.             }
  564.           }
  565.           else {
  566.             while (hycnt && (hyptr[hycnt-1]-1) > hyp)
  567.             --hycnt;
  568. #if    DEBUG == 1
  569.     printf("\nB-0 hycnt=%d hyp=%lx *hyp=%c *hyptr[hycnt-1]=%c",
  570.         hycnt,hyp,*hyp,hycnt ? *hyptr[hycnt-1]:0x7e);
  571. #endif
  572.             if (!hycnt)
  573.             goto nohyp;
  574.             if (cp.jstmd == AJ) {
  575.             if (!buf_ptr[NLTP] || buf_ptr[NLTP] > hyp)
  576.                 buf_ptr[NLTP] = hyp;
  577.             fnd = 0;
  578.             if (!buf_ptr[PRFP])
  579.                 goto nltshy;
  580.             for (i = 0;!fnd && i < hycnt;++i)
  581.             if (hyptr[i] >= buf_ptr[PRFP] &&
  582.                 hyptr[i] < buf_ptr[NLTP])
  583.                 fnd = 1;
  584.             if (fnd)
  585.                 hycnt = i;
  586.             else {
  587. nltshy:              for (i = 0;!fnd && i < hycnt;++i)
  588.               if (hyptr[i] >= buf_ptr[NLTP] &&
  589.                   hyptr[i] <= hyp)
  590.                 fnd = 1;
  591.               if (fnd)
  592.                 hycnt = i;
  593.               else
  594.               if (sp_lts)
  595.                 goto ltssp;
  596.             }
  597.             }
  598. brkhy:            for (;;) {
  599. #if    DEBUG == 1
  600.     printf("\nB-1 hycnt=%d *hyp=%c *hyptr[hycnt-1]=%c",
  601.         hycnt,*hyp,hycnt ? *hyptr[hycnt-1]:0x7e);
  602. #endif
  603.             while (!cpabt && hyp >= hyptr[hycnt-1])
  604.                 hyp = bwdct(hyp);
  605.             ptr = hyp;
  606.             if (cpabt)
  607.                 goto abort;
  608.             if (!(hymd & 3)) {
  609.               hyw = cwffp(HYfp);
  610.               if (cp.kernmd)
  611.                 kerning(HYfp,prvp1(hyp),&hyw);
  612.               clen -= hyw;
  613.             }
  614.             findst();
  615. #if    DEBUG == 1
  616.     printf("\nB-2 sflg=%d inovs=%d clen=%d cct=%d lspc=%d *hyp=%c",
  617.         sflg,inovs,clen,cct,lspc,*hyp);
  618. #endif
  619.             if (!inovs) {
  620.               CPrewindow(hyp+1);        /* should be OK...   */
  621.               ewp = prvp1(free_start-1);
  622.               if (hymd & 3) {        /* Hard - or M-,N-.. */
  623.                 if (setp.hylg == 5 &&
  624.                 *ewp == '-') {        /* Portuguese Hard - */
  625.                 CPrewindow(ewp);    /* bring Hard - down */
  626.                 goto inshy;        /* & insert Soft -.. */
  627.                 }
  628.                 else {
  629.                 ishy = 0;
  630.                 rshypn = 1;
  631.                 }
  632.               }
  633.               else
  634.               if (*ewp == DH) {        /* Disc hyphen found */
  635.                 ishy = 1;
  636.                 *ewp = sDH;
  637.                 clen += hyw;
  638.               }
  639.               else {            /* place Soft hyphen */
  640. inshy:                ishy = 1;
  641.                 *free_start++ = sHY;
  642.               }
  643.               if (ishy) {
  644.                 ++hypn;
  645.                 rshypn = 0;
  646.               }
  647.               break;
  648.             }
  649.             else
  650.             if (!(hymd & 3))
  651.                 clen += hyw;
  652.             if (!--hycnt) goto nohyp;
  653.             }
  654.           }
  655.           *free_start++ = srt;            /* insert srt/cr/lf  */
  656.           ckcrlf();
  657. #if    DEBUG == 1
  658.     printf("\nEnd B.. cct=%d\n",cct);
  659. #endif
  660.           if (rshypn) hypn = 0;
  661.           if (advdp()) {            /* down line space   */
  662.             cpabt = -1;            /* reach depth stop  */
  663.             goto Equit;
  664.           }
  665.           ptr        = current_char;
  666.           buf_ptr[CPBK] = scc;
  667.           movtotag(&ptr,CPBK);
  668.           if (cpabt)
  669.             goto Equit;
  670.           CPrewindow(buf_ptr[CPBK]);
  671.           if (inovs) {
  672.             scc    = current_char;
  673.             hymd    = hycnt    = 0;
  674.             rshypn    = sp_lts= 0;
  675.             nobrk    = 0;
  676. #if    DEBUG == 1
  677.     printf("\nStill OVS..Rebreak.. inovs=%d\n",inovs);
  678. #endif
  679.             goto rebrk;
  680.           }
  681.           if (!sp_lts) {
  682.             *nptr    = current_char;
  683.             if (nofa(ptr = *nptr,&ccfp))
  684.                 ++cct;
  685.             goto exchk;
  686.           }
  687.           else    *nptr    = current_char-1;
  688.         }
  689.         else {
  690.             clen += cw;
  691.             cpabt = 6;        /* text buffer full !    */
  692. abort:            if (getLch(ptr) == lf) ++ptr;
  693.             CPrewindow(ptr);
  694. Equit:            *nptr = current_char;
  695.         }
  696.     }
  697.     else
  698.     if (*ptr == ' ')
  699.         ++lspc;
  700.     else
  701. extst:    if (ptagc(*ptr))            /* Hit a PI    TAG    */
  702.         ptr = ++*nptr;
  703. exfct:
  704. #if    DEBUG == 1
  705.   printf("\nFwct sflg=%d inovs=%d clen=%d cw=%d lspc=%d cct=%d ptr=%lx c=%c",
  706.         sflg,inovs,clen,cw,lspc,cct,ptr,*ptr);
  707. #endif
  708.     return(cpabt);                /* return CP state...    */
  709. }
  710.  
  711. /*
  712.     Function to do backward counting on the character at pointer
  713. */
  714. unsigned char *bwdct(ptr)
  715. unsigned char *ptr;
  716. {
  717.     unsigned    cw;
  718.     unsigned char    ccfp, *pc, *pcp;
  719.  
  720.     pc = prvp1(ptr);
  721.     if (*pc == STAG)            /* Hit a Start    TAG    */
  722.         out_tag(*ptr,1,0);
  723.     else
  724.     if (*pc == ETAG)            /* Hit an End    TAG    */
  725.         in_tag(*ptr,1,0);
  726.     else
  727.     if (ptagc(*pc)) {            /* Hit a PI    TAG    */
  728.         ptr = pc;
  729.         pcp = prvp1(pc-1);
  730.         goto nch;
  731.     }
  732.     else
  733.     if (allend(*ptr))
  734.         cpabt = 5;
  735.     else
  736.     if (!nocp(*ptr)) {
  737.       pcp = prvp1(pc-1);
  738.       if (*ptr == sHY) {
  739.         ckcomp(pcp);
  740.         cw = cwffp(HYfp);
  741.         if (cp.kernmd)
  742.             kerning(HYfp,pcp,&cw);
  743.         if (cct) --cct;
  744.       }
  745.       else
  746.       if (*ptr == ' ') {
  747.         cw = cwfrw(spbval,0);
  748.         if (lspc) --lspc;
  749.       }
  750.       else
  751. nch:      if (!gfpfa(&ccfp,ptr)) {
  752.         ckcomp(pcp);
  753.         cw = cwffp(ccfp);
  754.         if (cp.kernmd)
  755.             kerning(ccfp,pcp,&cw);
  756.         if (cct) --cct;
  757.       }
  758.       else    cw = 0;
  759.       clen    += cw;
  760.     }
  761. #if    DEBUG == 1
  762.     printf("\nBwct sflg=%d inovs=%d clen=%d cw=%d lspc=%d cct=%d p=%lx c=%c",
  763.         sflg,inovs,clen,cw,lspc,cct,ptr,*ptr);
  764. #endif
  765.     return(--pc >= buf_start ? pc : buf_start);
  766. }
  767.  
  768. wbrk(ccp)
  769. unsigned char    *ccp;
  770. {
  771.     unsigned char    pc, cc = getLch(ccp);
  772.     return(    (cc == ' ')    ||
  773.         (cc == cr    &&
  774.         ((pc = getLch(ccp-1)) == ' ' || allend(pc))) );
  775. }
  776.  
  777. cpch(ptr)
  778. unsigned char    *ptr;
  779. {
  780.     unsigned char    ch = *ptr;
  781.     return( ptagc    (ch)    ||        /* is  a PI TAG or    */
  782.         (!ctagc    (ch)    &&        /* [not a TAG marker    */
  783.         ch    != ' '    &&        /* not a spaceband    */
  784.         !nocp    (ch)    &&        /* is  a comp. char    */
  785.         !allend    (ch)) );        /* not a line ending]    */
  786. }
  787.  
  788. nofa(ptr,cfp)
  789. unsigned char    *ptr, *cfp;
  790. {
  791.     return(cpch(ptr) && !gfpfa(cfp,ptr));
  792. }
  793.  
  794. kerning(rfp,lptr,valp)
  795. unsigned char    rfp, *lptr;        /* rfp:right fp, lptr -> left c    */
  796. int        *valp;            /* valp -> value to (-) kerning */
  797. {
  798.     int        kv;
  799.     unsigned char    lfp;
  800.  
  801.     if (nofa(lptr,&lfp)) {            /* check left char...    */
  802.         getkerval(lfp,0);
  803.         getkerval(rfp,1);
  804.         kv = cmpknval();
  805.         if (kv >= *valp)
  806.             *valp = 0;
  807.         else    *valp -= kv;
  808.     }
  809. }
  810.  
  811. ckcomp(lcp)
  812. unsigned char    *lcp;
  813. {
  814.     int    tst;
  815.  
  816.     if (!cp.mcomp && !cp.acomp)
  817.         return;
  818.     tst = cpch(lcp);
  819.     if (cp.mcomp)
  820.         cmpval = tst ? cp.mcomp:0;
  821.     if (cp.acomp)
  822.         avcval = tst ? acmp:0;
  823. }
  824.  
  825. gfpfa(fp,cp)
  826. unsigned char    *fp, *cp;
  827. {
  828.     if (ptagc(*cp))
  829.         *fp = *(++cp);
  830.     else    *fp = getfp(*cp);
  831.     if (*fp != 255)
  832.         return(getfd(50,*fp) & Fac);
  833.     else    return(0);
  834. }
  835.  
  836. ckcrlf()
  837. {
  838.     if (*current_char != cr) {
  839.         addcrlf();
  840.         CPrewindow(current_char);
  841.     }
  842.     else    CPrewindow(current_char + 2);
  843. }
  844.  
  845. /*
  846.     Function to test text buffer limit. Returns true/false
  847. */
  848. nofsp()
  849. {
  850.     return(free_start >= current_char - MIN_LEFT);
  851. }
  852.  
  853. /*
  854.     Function to intialize all composition parameters for Fend.
  855. */
  856. initfcmp()
  857. {
  858.     cdep    = cp.lnsp;            /* set start depth    */
  859.     clen    = cp.llen;            /* set LineLen counter    */
  860.     smsz    = cp.ssiz;            /* set smallest SetSize    */
  861.     spbval    = cp.minsp + cp.prfsp;        /* set space value    */
  862.     HYfp    = getfp('-');
  863.     cmpval    = avcval = 0;
  864.     ckfont(cp.font);            /* set startup font    */
  865.     sflg    = inovs = false;
  866.     lspc    = cct    = 0;
  867.     zerocpptrs();
  868. }
  869.  
  870. unsigned char    *prvp1(ptr)
  871. unsigned char    *ptr;
  872. {
  873.     if (ptr > buf_start && tagc(*(ptr-1)))
  874.         --ptr;
  875.     return(ptr);
  876. }
  877.  
  878. unsigned char    *prvp2(ptr)
  879. unsigned char    *ptr;
  880. {
  881.     if (ptr > current_char && tagc(*(ptr-1)))
  882.         --ptr;
  883.     return(ptr);
  884. }
  885.  
  886. static
  887. unsigned char    *prvp3(ptr)
  888. unsigned char    *ptr;
  889. {
  890.     while (ptr > buf_start && tagc(*(ptr-1))) {
  891.         if (ptagc(*(ptr-1))) {
  892.             --ptr;
  893.             break;
  894.         }
  895.         else    ptr -= 2;
  896.     }
  897.     if (ptr < buf_start)
  898.         ptr = buf_start;
  899.     return(ptr);
  900. }
  901.  
  902. unsigned char    getLch(ptr)
  903. unsigned char    *ptr;
  904. {
  905.     ptr = prvp1(ptr);
  906.     return(*ptr);
  907. }
  908.